# -*- coding: utf-8 -*-
from django.db import models
from django.core.exceptions import ValidationError
from django.contrib.auth.models import User
from django.core.validators import MinValueValidator


TipoMensaje = (
    ('1', 'SMS'),
    ('2', 'EMAIL'),
)

class Genero (models.Model):
    codigo = models.CharField(max_length = 1)
    nombre = models.CharField(max_length = 20)
    
    def __unicode__(self):
        return self.nombre

class MovimientoTipo (models.Model):
    codigo = models.CharField(max_length = 3)
    nombre = models.CharField(max_length = 70)
    abreviatura = models.CharField(max_length = 8)
    descripcion = models.TextField(max_length=300, blank=True, null=True)
    
    def __unicode__(self):
        return self.nombre

class TipoDocumento (models.Model):
    codigo = models.CharField(max_length = 3)
    nombre = models.CharField(max_length = 70)
    abreviatura = models.CharField(max_length = 8)
    
    def __unicode__(self):
        return self.nombre


class Configuracion(models.Model):
    usuario = models.ForeignKey(User, verbose_name='Usuario', blank=True)
    institucion = models.CharField(max_length=200, verbose_name="Institución")
    logo = models.ImageField(upload_to='img', blank=True)
    recordatorio_sms = models.IntegerField(help_text='Recordatorio a través de mensajes de texto al celular.', blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    recordatorio_email = models.IntegerField(help_text='Recordatorio a través de correo electrónico.', blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    sms_moroso = models.IntegerField(max_length=3, help_text='Días trascurridos para enviar el mensaje de texto.', blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    email_moroso = models.IntegerField(max_length=3, help_text='Días trascurridos para enviar el correo electrónico.', blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    tasa_interes = models.FloatField(help_text="Tasa de interés mes vencido", verbose_name="Saldo de crédito", blank=True, null=True, default=0, validators=[MinValueValidator(0)])

    def save(self, *args, **kwargs):
        # tmp_logo = u"logo_%s.jpg" %(self.id)
        tmp_logo = self.logo.name
        self.logo.name = tmp_logo
        super(Configuracion, self).save(*args, **kwargs)
            
    def __unicode__(self):
        return u'%s' %(self.institucion)
    
    class Meta:
        verbose_name_plural = 'Configuraciones'


class Facultad(models.Model):
    configuracion = models.ForeignKey(Configuracion)
    sigla = models.CharField(max_length=100)
    nombre = models.CharField(max_length=200)
    semestres = models.IntegerField(max_length=2, validators=[MinValueValidator(0)])
    
    def __unicode__(self):
        return self.sigla
    
    class Meta:
        verbose_name_plural = 'Facultades'
        
    
class Periodo(models.Model):
    configuracion = models.ForeignKey(Configuracion)
    nombre = models.CharField(max_length=20)
    fecha_inicio = models.DateField(verbose_name='Fecha de inicio de periodo', help_text='Indica la fecha desde la cual se da inicio al periodo académico', blank=True, null=True)
    fecha_fin = models.DateField(verbose_name='Fecha de inicio de periodo', help_text='Indica la fecha desde la cual se da inicio al periodo académico', blank=True, null=True)
    corte_fin_mes = models.BooleanField(help_text='Indica si se hará corte al final de cada mes.', blank=True)
    meses = models.IntegerField(max_length=2, validators=[MinValueValidator(0)], default=0)
    
    def __unicode__(self):
        return self.nombre
    
    
class Estudiante(models.Model):
    configuracion = models.ForeignKey(Configuracion)
    nombre1 = models.CharField(max_length=45)
    nombre2 = models.CharField(max_length=45, blank=True, null=True)
    apellido1 = models.CharField(max_length=45)
    apellido2 = models.CharField(max_length=45, blank=True, null=True)
    tipo_documento = models.ForeignKey(TipoDocumento, blank=True, default=1)
    identificacion = models.CharField(max_length=20, blank=True, null=True)
    direccion = models.CharField(max_length=45, blank=True, null=True)
    telefono = models.CharField(max_length=30, blank=True, null=True)
    celular = models.CharField(max_length=10, blank=True, null=True)
    email = models.CharField(max_length=60, blank=True, null=True)
    observacion = models.TextField(max_length=300, blank=True, null=True)
    codeudor = models.CharField(max_length=80, blank=True, null=True)
    codeudor_telefono = models.CharField(max_length=30, blank=True, null=True)
    codeudor_celular = models.CharField(max_length=10, blank=True, null=True)
    codeudor_email = models.CharField(max_length=60, blank=True, null=True)
    
    def __unicode__(self):
        return u'%s %s' %(self.nombre1, self.apellido1)
    
    def nombre(self):
        return u'%s %s %s %s' %(self.nombre1, self.nombre2, self.apellido1, self.apellido2)
    
    def institucion(self):
        return u'%s' %(self.configuracion.institucion)
     
class Matricula(models.Model):
    estudiante = models.ForeignKey(Estudiante)
    facultad = models.ForeignKey(Facultad)
    periodo = models.ForeignKey(Periodo)
    semestre = models.IntegerField(max_length=2, validators=[MinValueValidator(0)], default=0)
    fecha = models.DateField(help_text='Fecha de solicitud de crédito', blank=True, null=True)
    valor_credito = models.FloatField(help_text="Valor del crédito", verbose_name="Valor de crédito", blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    valor_descuento = models.FloatField(help_text="Valor de descuento", blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    intereses = models.FloatField(help_text="Intereses", blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    cuotas = models.IntegerField(max_length=2, validators=[MinValueValidator(0)], default=0)
    saldo = models.FloatField(help_text="Saldo del crédito", verbose_name="Saldo de crédito", blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    cuotas_pendientes = models.IntegerField(max_length=2, validators=[MinValueValidator(0)], default=0)
    
    class Meta:
        unique_together = ("estudiante", "facultad", "periodo", "semestre")
    
    def __unicode__(self):
        return u'%s %s' %(self.estudiante.nombre1, self.estudiante.apellido1)
    
    
class Pagos(models.Model):
    matricula = models.ForeignKey(Matricula)
    cuota_id = models.IntegerField(default=1)
    fecha = models.DateField(verbose_name='Fecha de inicio de periodo', help_text='Indica la fecha desde la cual se da inicio al periodo académico', blank=True, null=True)
    valor = models.FloatField(help_text="Valor cuota", verbose_name="Valor cuota", blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    fecha_pago = models.DateField(verbose_name='Fecha de pago al día', help_text='Indica la fecha en la cual el estudiante se puso al día en la oblicación', blank=True, null=True)
    pagado = models.FloatField(help_text="Valor pagado", verbose_name="Valor pagado", blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    cancelada = models.BooleanField(help_text='Indica si la cuota fué pagada en su totalidad.', blank=True)
    observacion = models.TextField(max_length=300, blank=True, null=True)
    
    def __unicode__(self):
        return u'%s %s' %(self.matricula.estudiante.identificacion, self.fecha)
    
    class Meta:
        verbose_name_plural = 'Pagos'
        

class Concepto(models.Model):
    configuracion = models.ForeignKey(Configuracion)
    codigo = models.CharField(max_length=20)
    nombre = models.CharField(max_length=200)
    
    def __unicode__(self):
        return self.nombre
    
class Movimiento(models.Model):
    configuracion = models.ForeignKey(Configuracion)
    estudiante = models.ForeignKey(Estudiante)
    fecha = models.DateField(verbose_name='Fecha de inicio de periodo', help_text='Indica la fecha desde la cual se da inicio al periodo académico', blank=True, null=True)
    ciudad = models.TextField(max_length=300, blank=True, null=True)
    movimientoTipo = models.ForeignKey(MovimientoTipo, blank=True, default=1)
    consecutivo = models.IntegerField(help_text='Fecha de solicitud de crédito', blank=True, null=True)
    concepto = models.TextField(max_length=300, blank=True, null=True)
    debito = models.FloatField(help_text="Débito", verbose_name="Débito", blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    credito = models.FloatField(help_text="Crédito", verbose_name="Crédito", blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    
    class Meta:
        verbose_name_plural = 'Movimiento contable'
    
    def __unicode__(self):
        return u'%s %s' %(self.estudiante.nombre1, self.estudiante.apellido1)
    
    
class MovimientoConcepto(models.Model):
    movimiento = models.ForeignKey(Movimiento)
    concepto = models.ForeignKey(Concepto)
    valor = models.FloatField(help_text="Valor de concepto", verbose_name="Valor de concepto", blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    observacion = models.TextField(max_length=300, blank=True, null=True)
    
    def __unicode__(self):
        return u'%s %s' %(self.movimiento.estudiante.identificacion, self.movimiento.movimientoTipo.nombre)
    
    class Meta:
        verbose_name_plural = 'Pagos'
        
class LogMensajes(models.Model):
    fecha = models.DateTimeField(help_text='Fecha de envío de recordatorio', blank=True, null=True)
    estudiante = models.ForeignKey(Estudiante)
    configuracion = models.ForeignKey(Configuracion)
    tipo = models.CharField(max_length=1, choices=TipoMensaje, blank=True, default='0')
    destino = models.CharField(max_length=60, blank=True, null=True)
    mensaje = models.TextField(max_length=500, blank=True, null=True)
    def __unicode__(self):
        return u'%s' %(self.estudiante)


    class Meta:
        verbose_name_plural = 'Log de Mensajes'
        
class Notificaciones(models.Model):
    configuracion = models.ForeignKey(Configuracion)
    fecha = models.DateField()
    notificados = models.IntegerField(blank=True, null=True, default=0, validators=[MinValueValidator(0)])
    descripcion = models.TextField(max_length = 500, blank=True, null=True)
    
    def __unicode__(self):
        return self.fecha